package com.zjgk.bigclassenv.component;

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @ServerEndPoint 注解是一个类层次的注解，它的功能主要是将目前的类定义成一个websocket服务器端，
 * 注解的值将被用于监听用户连接的终端访问URL地址，客户端可以通过这个URL连接到websocket服务器端
 */
@ServerEndpoint("/websocket/{id}")
@Component
public class WebSockComponent {
    private static int onlineCount=0;
    private static final Map<String, Session> webSocketSet=new ConcurrentHashMap<>();
    private Session session;
 
    @OnOpen
    public void onOpen(Session session, @PathParam("id") String id){
        webSocketSet.put(id,session);
        addOnlineCount();
        System.out.println("有新连接加入！当前在线人数为"+getOnlineCount());
    }

    @OnClose
    public void onClose(@PathParam("id") String id){
        webSocketSet.remove(id);
        subOnlineCount();
        System.out.println("有一连接关闭！当前在线人数为" + getOnlineCount());
    }
 
    @OnMessage
    public void onMessage(String message,Session session,@PathParam("id") String id){
        System.out.println("来自客户端"+ id +"的消息："+message);
        JSONObject obj = JSONUtil.parseObj(message);
        String toId = obj.getStr("to"); // to表示发送给哪个用户，比如 admin
        String text = obj.getStr("text"); // 发送的消息文本  hello
        Session toSession = webSocketSet.get(toId); // 根据 to用户名来获取 session，再通过session发送消息文本
        JSONObject jsonObject = new JSONObject();
        long time = System.currentTimeMillis();
        if (toSession != null) {
            // 服务器端 再把消息组装一下，组装后的消息包含发送人和发送的文本内容
       
            jsonObject.set("from", id);  // from
            jsonObject.set("text", text);  // text 同上面的text
            jsonObject.set("to", toId);  // to
            jsonObject.set("time",time);

            this.sendMessage(jsonObject.toString(), toSession);
            System.out.println("发送给用户username={}，消息：{}"+ toId + jsonObject.toString());
        } else {
            jsonObject.set("from", id);  // from
            jsonObject.set("text", text);  // text 同上面的text
            jsonObject.set("to", toId);  // to
            jsonObject.set("time",time);  
            
            
            System.out.println("用户"+ toId+"不在线");
        }


        //        群发消息
//        for (WebSockTest item:webSocketSet){
//            try {
//                item.sendMessage(message);
//            } catch (IOException e) {
//                e.printStackTrace();
//                continue;
//            }
//        }
    }
 
    @OnError
    public void onError(Session session,Throwable throwable){
        System.out.println("发生错误！");
        throwable.printStackTrace();
    }
//   下面是自定义的一些方法
    public void sendMessage(String message,Session toSession){
        try {
            toSession.getBasicRemote().sendText(message);
        }catch (Exception e){
            System.out.println("失败"+e.getMessage());
        }

    }
    
    public static synchronized int getOnlineCount(){
        return onlineCount;
    }
    public static synchronized void addOnlineCount(){
        WebSockComponent.onlineCount++;
    }
    public static synchronized void subOnlineCount(){
        WebSockComponent.onlineCount--;
    }
}